import store from '@/store';
const listMixin = {
  data() {
    return {
      // 遮罩层
      loading: false,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 查询参数
      queryParams: {
        page: 1,
        page_size: 10,
        ordering: undefined
      },
      actionFuncName: undefined,
      // 操作权限控制
      permissions: [],
      // 操作描述以及对应的接口
      actionApi: {}
    }
  },
  created() {
    this.handleOperatePermission();
    this.initialize();
    this.getList();
  },
  methods: {
    /** 初始化函数，在组件中重写并调用初始化用到的函数 */
    initialize() {
    },
    /** 查询数据列表 */
    async getList() {
      // 查询前启动遮罩层
      this.loading = true;
      // 查询数据
      var resp = await store.dispatch(this.actionFuncName, this.queryParams);
      if (resp.success) {
        // 接口执行成功，关闭遮罩层
        this.total = resp.data.count;
        this.loading = false;
      } else {
        // 接口执行失败，提示错误信息并关闭遮罩层
        this.targaMessageBox(this, resp.msg);
        this.loading = false;
      }
    },
    /** 获取页面操作权限 */
    handleOperatePermission() {
      // handleMenuPermission为内置方法，可以获取当前页面的操作权限，并返回数组
      this.permissions = this.handleMenuPermission(this);
    },
    /** 处理列表排序 */
    sortChange({ prop, order }) {
      // prop：需要排序字段
      // order：排序方式，倒叙还是正序
      var ordering;
      // 重置查询条件中的排序规则：ordering
      if (order === 'ascending') {
        ordering = '' + prop;
      } else if (order === 'descending') {
        ordering = '-' + prop;
      } else {
        ordering = undefined;
      }
      this.queryParams.ordering = ordering;
      // 重新执行查询
      this.getList();
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.page = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      Object.keys(this.queryParams).forEach(key => {
        if (key !== 'page' && key !== 'page_size') {
          this.queryParams[key] = undefined;
        }
      });
      this.handleQuery();
    },
    /** 操作通用处理方法 */
    async handleAction(action, id, confirmMessage, successMessage) {
      const confirmOptions = {
        confirmButtonText: this.$t('confirm'),
        cancelButtonText: this.$t('cancel'),
        cancelButtonClass: 'btn-cancel-to-right',
        type: 'warning'
      };

      try {
        await this.$confirm(confirmMessage, this.$t('warning'), confirmOptions);
        const api = this.actionApi[action]
        const resp = await api(id);
        if (resp.success) {
          this.targaMessage(successMessage);
          this.getList();
        } else {
          this.targaMessageBox(this, resp.msg);
        }
      } catch (err) {
        console.error(err);
      }
    },

    async handleBatchAction(action, data) {
      const confirmOptions = {
        confirmButtonText: this.$t('confirm'),
        cancelButtonText: this.$t('cancel'),
        cancelButtonClass: 'btn-cancel-to-right',
        type: 'warning'
      };

      try {
        await this.$confirm(this.$t('executeConfirm'), this.$t('warning'), confirmOptions);
        const api = this.actionApi[action]
        const resp = await api(data);
        if (resp.success) {
          this.targaMessage(this.$t('executeSuccess'));
          this.getList();
        } else {
          this.targaMessageBox(this, resp.msg);
        }
      } catch (err) {
        console.error(err);
      }
    }
  }
}

export default listMixin
